package com.dlc.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dlc.shop.bean.app.dto.ShopHeadInfoDto;
import com.dlc.shop.bean.app.param.ShopAuditingParam;
import com.dlc.shop.bean.dto.ShopCreateInfoDTO;
import com.dlc.shop.bean.dto.ShopSigningInfoDTO;
import com.dlc.shop.bean.model.ShopDetail;
import com.dlc.shop.bean.param.*;
import com.dlc.shop.common.util.PageParam;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 *
 * @author lgh on 2018/08/29.
 */
public interface ShopDetailService extends IService<ShopDetail> {

    /**
     * 修改店铺信息
     * @param shopDetail 店铺信息参数
     */
    void updateShopDetail(ShopDetail shopDetail);

    /**
     * 通过经纬度计算距离
     * @param lat 纬度
     * @param lng 经度
     * @param shopId 店铺id
     * @return 距离
     */
    double getDistance(Double lat, Double lng, Long shopId);

    /**
     * 根据店铺id获取店铺信息
     * @param shopId 店铺id
     * @return 店铺信息
     */
    ShopDetail getShopDetailByShopId(Long shopId);

    /**
     * 删除店铺详情缓存
     * @param shopId 店铺id
     */
    void removeShopDetailCacheByShopId(Long shopId);

    /**
     * 根据店铺的手机号（登陆账号），获取店铺信息
     *
     * @param mobile 手机号
     * @return 店铺详情
     */
    ShopDetail getShopByMobile(@Param("mobile") String mobile);

    /**
     * 修改用户密码
     * @param username 用户名称/账号
     * @param newPassword 新密码
     */
    void updatePasswordByUserName(String username, String newPassword);


    /**
     * 根据用户id查询店铺信息
     * @param userId 用户id
     * @return 店铺信息
     */
    ShopDetail getShopDetailByUserId(String userId);

    /**
     * 申请开店铺
     * @param userId 用户id
     * @param shopDetailParam 店铺信息参数
     */
    void applyShop(String userId, ShopDetailParam shopDetailParam);

    /**
     * 审核商家信息
     * @param shopAuditingParam 审核参数
     * @return 布尔值
     */
    boolean audit(ShopAuditingParam shopAuditingParam);

    /**
     * 平台 --下线活动商品
     * @param shopDetail 店铺信息
     * @param offlineReason 下线原因
     * @param sysUserId 系统用户id
     */
    Long offline(ShopDetail shopDetail, String offlineReason, Long sysUserId);

    /**
     * 申请审核
     * @param eventId 事件id
     * @param handleId 店铺id
     * @param reapplyReason 重启申请原因
     */
    void auditApply(Long eventId, Long handleId, String reapplyReason);

    /**
     * 审核下线商店
     * @param offlineHandleEventAuditParam 下线参数
     * @param sysUserId 系统用户id
     */
    void auditOfflineShop(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);

    /**
     * 店铺违规下线，无需店铺申请，平台直接上线店铺
     *
     * @param offlineHandleEventAuditParam
     * @param sysUserId
     */
    void onlineOpenShop(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);

    /**
     * 热门店铺
     * @return  热门店铺列表
     */
    List<ShopHeadInfoDto> listHotShopsHead();

    /**
     * 分页搜索店铺
     * @param page 分页参数
     * @param shopHeadInfoDto 条件参数
     * @return 热搜店铺分页信息
     */
    Page<ShopHeadInfoDto> searchShops(PageParam<ShopHeadInfoDto> page, ShopHeadInfoDto shopHeadInfoDto);

    /**
     *  新增店铺
     * @param shopDetail 店铺详情
     * @param count 数量
     */
    void insertDetail(ShopDetail shopDetail, long count);

    /**
     * 统计店铺电话号码
     * @param mobile 电话号码
     * @param shopId 店铺id
     * @return 数量
     */
    long checkMobile(String mobile, Long shopId);

    /**
     * 修改店铺账号密码
     * @param shopId 店铺id
     * @param password 密码
     * @param mobile 电话号码
     * @param count 数量
     */
    void updatePasswordOrMobile(Long shopId, String password, String mobile, Long count);

    /**
     * 批量修改店铺类型
     * @param shopTypeParam 店铺类型参数
     */
    void batchUpdateShopType(ShopTypeParam shopTypeParam);

    /**
     * 平台创建店铺
     * @param shopCreateInfoDTO
     * @param userId
     */
    ShopCreateInfoDTO platformCreateShop(ShopCreateInfoDTO shopCreateInfoDTO, Long userId);

    /**
     * 根据店铺id更新店铺状态
     * @param shopId
     * @param status
     */
    void updateStatus(Long shopId, Integer status);

    /**
     * 根据签约时间修改店铺状态
     * @param now
     */
    void changeShopStatusByContractTime(Date now);

    /**
     * 更新店铺签约信息
     * @param shopSigningInfoDTO
     */
    void updateSigningInfo(ShopSigningInfoDTO shopSigningInfoDTO);

    /**
     * 导出店铺
     * @param auditingInfoParam
     * @param response
     */
    void exportShop(AuditingInfoParam auditingInfoParam, HttpServletResponse response);

    /**
     * 分页获取店铺列表（营业、停业状态）
     * @param page
     * @param shopSearchParam
     * @return
     */
    IPage<ShopHeadInfoDto> renovationShopPage(PageParam<ShopDetail> page, ShopSearchParam shopSearchParam);

    /**
     * 店铺列表（营业、停业状态）
     * @param shopSearchParam
     * @return
     */
    List<ShopHeadInfoDto> listRenovationShop(ShopSearchParam shopSearchParam);

    /**
     * 根据店铺ids获取店铺详情列表
     * @param shopIds 店铺ids
     * @return
     */
    List<ShopDetail> getShopDetailByShopIds(List<Long> shopIds);

    /**
     * 定时任务计算并修改每个店铺评分
     * @param shopId 店铺id
     */
    void computeShopScore(Long shopId);

    /**
     * 给还没创建通联会员的商家创建会员账号
     * 适用于平台开通通联支付前注册的商家
     */
    void createAllinpayMember();

    /**
     * 根据店铺id创建通联会员账户
     * @param shopId
     */
    void createAllinpayMemberByShopId(Long shopId);

    /**
     * 更新商家影印件采集状态
     *
     * @param bizUserId
     * @param status
     */
    void updateAllinpayIdCardStatus(String bizUserId, Integer status);

    /**
     * 更新通联店铺状态为成功
     * @param shopId
     */
    void updateShopAllinpayStatusToSuccess(Long shopId);

}
